nanopyx.core.transform.image_shift_rotate

Combination of functions for rotating an image over an arbitrary center, using several interpolation methods.

 1"""
 2Combination of functions for rotating an image over an arbitrary center, using several interpolation methods.
 3"""
 4
 5from scipy.ndimage import rotate
 6import numpy as np
 7
 8from ..utils.timeit import timeit2
 9from . import interpolation_bicubic
10from . import interpolation_bilinear
11from . import interpolation_nearest_neighbor
12from . import interpolation_catmull_rom
13from . import interpolation_lanczos
14
15from skimage.transform import AffineTransform, warp
16import cv2
17
18@timeit2
19def catmull_rom_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
20    interpolator = interpolation_catmull_rom.Interpolator(image)
21    return interpolator.rotate(angle, cx, cy)
22
23
24@timeit2
25def lanczos_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
26    interpolator = interpolation_lanczos.Interpolator(image)
27    return interpolator.rotate(angle, cx, cy)
28
29
30@timeit2
31def bicubic_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
32    interpolator = interpolation_bicubic.Interpolator(image)
33    return interpolator.rotate(angle, cx, cy)
34
35
36@timeit2
37def bilinear_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
38    interpolator = interpolation_bilinear.Interpolator(image)
39    return interpolator.rotate(angle, cx, cy)
40
41
42@timeit2
43def nearest_neighbor_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
44    interpolator = interpolation_nearest_neighbor.Interpolator(image)
45    return interpolator.rotate(angle, cx, cy)
46
47
48#def scipy_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
49#scipy does not have a simple rotation around an arbitrary point which preserves image size
50#shift + rotation + shift would work but we lose information
51
52@timeit2
53def skimage_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
54    rotation = AffineTransform(rotation=angle)
55    shift2center = AffineTransform(translation=-np.array([cx, cy]))
56    shift2og = AffineTransform(translation=np.array([cx, cy]))
57    return warp(image, shift2center + rotation + shift2og)
58
59
60@timeit2
61def cv2_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float):
62    rotmat = cv2.getRotationMatrix2D(np.array([cx,cy]), np.rad2deg(angle), 1)
63    return cv2.warpAffine(image, rotmat, image.shape[:2][::-1])